package com.crm.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.crm.mapper.DeptMapper;
import com.crm.dto.DeptDto;
import com.crm.entity.Dept;
import com.crm.exception.BaseException;
import com.crm.service.IDeptService;
import com.crm.utils.DeptValidator;
import com.crm.vo.DeptTreeVo;
import com.crm.vo.SysDept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements IDeptService {
    @Autowired
    private DeptMapper deptMapper;
    @Autowired
    private UserServiceImpl  userService;
    /**
     * 新增部门信息
     */
    @Override
    @Transactional
    public void savedept(Dept dept) {
        // 处理顶级部门逻辑（parentId为空时设为顶级部门）
        if (dept.getParentId() == null) {
            dept.setParentId(0L);
            dept.setParentName("顶级部门"); // 顶级部门固定名称
        } else {
            //非顶级部门：校验上级部门是否存在
            Dept parentDept = deptMapper.selectOne(Wrappers.<Dept>lambdaQuery().eq(Dept::getDeptId,dept.getParentId()));
            if (parentDept == null) {
                throw new BaseException("上级部门不存在，请重新选择");
            }
            //关键逻辑：若parentName为空，自动从数据库获取上级部门的名称
            if (dept.getParentName() == null || dept.getParentName().trim().isEmpty()) {
                dept.setParentName(parentDept.getDeptName());
            }
        }
        //校验部门名称
        DeptValidator.validateDeptName(dept.getDeptName());
        //校验部门名称唯一性
        if (deptMapper.exists(new LambdaQueryWrapper<Dept>().eq(Dept::getDeptName,dept.getDeptName()))){
            throw new BaseException("部门名称已存在，请重新输入");
        }
        //校验层级
        if (dept.getParentId()!=0){
            //校验层级
            Integer level = getDeptLevel(dept.getParentId());
            if (level >= 3) {
                throw new BaseException("最多支持3级部门，当前上级部门已达3级");
            }
        }
        //状态默认处理
//        if (dept.getStatus() == null){
//            dept.setStatus("正常");
//        }
//        dept.setCreateBy("1");
//        dept.setUpdateTime(LocalDateTime.now());
//        dept.setCreateTime(LocalDateTime.now());
        // 关键修改：使用带时区的时间戳（解决时区问题）
        LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
        dept.setCreateBy("1");
        dept.setUpdateTime(now);
        dept.setCreateTime(now);
        deptMapper.insert(dept);
    }

    /**
     * 线索查询部门列表
     * @return
     */
    @Override
    public List<DeptTreeVo> getDeptTreeList() {
        List<SysDept> deptList = deptMapper.selectAllDepts();
        List<DeptTreeVo> deptTreeVos = buildDeptTree(deptList);
        return deptTreeVos;
    }
    private List<DeptTreeVo> buildDeptTree(List<SysDept> deptList) {
        Map<Long, DeptTreeVo> map = new HashMap<>();
        deptList.forEach(dept -> {
            DeptTreeVo vo = new DeptTreeVo();
            vo.setId(dept.getDeptId());
            vo.setLabel(dept.getDeptName());
            vo.setChildren(new ArrayList<>());
            map.put(dept.getDeptId(), vo);
        });
        List<DeptTreeVo> rootList = new ArrayList<>();

        deptList.forEach(dept -> {
            DeptTreeVo current = map.get(dept.getDeptId());
            if (dept.getParentId() == null || dept.getParentId() == 0) {
                rootList.add(current);
            } else {
                DeptTreeVo parent = map.get(dept.getParentId());
                if (parent != null) {
                    parent.getChildren().add(current);
                }
            }
        });

        return rootList;
    }

    // 递归计算部门层级
    private Integer getDeptLevel(Long deptId) {
        Dept dept =deptMapper.selectOne(Wrappers.<Dept>lambdaQuery().eq(Dept::getDeptId,deptId));
        if (dept == null) {
            return 0;
        }
        if (dept.getParentId() == 0) {
            return 1;
        }
        return getDeptLevel(dept.getParentId()) + 1;
    }
    /**
     * 部门信息滑动查询
     */
    @Override
    public List<Dept> loadDeptByScroll(String deptName, String status) {
        LambdaQueryWrapper<Dept> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(StringUtils.isNotEmpty(deptName),Dept::getDeptName,deptName);
        wrapper.like(StringUtils.isNotEmpty(status),Dept::getStatus,status);
        return deptMapper.selectList(wrapper);
//        //模糊查询
//        String likedeptName = deptName == null ? null : "%"+ deptName+"%";
//        // 计算偏移量：首次加载从 0 开始，加载更多时根据 lastId 查询当前位置
//        int offset = 0;
//        if (loadMore && lastId != null) {
//            // 通过 lastId 查询其在排序后的位置（实际项目中可能需要优化这一步）
//            offset = deptMapper.getOffsetById(lastId, likedeptName, status);
//        }
//        // 查询数据
//        List<Dept> deptList = deptMapper.selectDeptPage(
//                likedeptName,
//                status,
//                offset,
//                PAGE_SIZE
//        );
//        // 判断是否还有更多数据
//        boolean hasMore = deptList.size() == PAGE_SIZE;
//        // 封装结果
//        return new ScrollResult<>(deptList, hasMore);
    }
    /**
     * 根据部门ID查询部门信息（除了上级部门）
     */
    @Override
    public Dept getById(Integer deptId) {
        LambdaQueryWrapper<Dept> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Dept::getDeptId,deptId);
        return deptMapper.selectOne(wrapper);
    }
    /**
     * 根据部门ID删除部门信息
     */
    @Override
    public void removeById(Integer deptId) {
        //检查部门是否存在
        if(!this.deptMapper.exists(new LambdaQueryWrapper<Dept>().eq(Dept::getDeptId,deptId))){
            throw new BaseException("部门不存在");
        }
        //检查部门下是否存在子部门
        boolean hasChildren = lambdaQuery()
                .eq(Dept::getParentId,deptId)
                .eq(Dept::getDelFlag , "0")
                .exists();
        if(hasChildren){
            throw new BaseException("部门下存在子部门，无法删除");
        }
        //检查部门下是否存在用户
        boolean hasUser= userService.hasUserRel(deptId);
        if(hasUser){
            throw new BaseException("部门下存在用户，无法删除");
        }
        //执行删除
        lambdaUpdate()
                .eq(Dept::getDeptId,deptId)
                .remove();
    }
    /**
     * 禁用部门信息
     */
    @Override
    public void disableDept(DeptDto deptDto) {
        //检查部门是否存在
        if(!this.deptMapper.exists(new LambdaQueryWrapper<Dept>().eq(Dept::getDeptId,deptDto.getDeptId()))){
            throw new BaseException("部门不存在");
        }
        //检查部门是否被禁用
        if(deptDto.getStatus().equals("禁用")){
            throw new BaseException("部门已禁用");
        }
        //修改状态为禁用
        lambdaUpdate()
                .eq(Dept::getDeptId,deptDto.getDeptId())
                .set(Dept::getStatus,deptDto.getStatus())
                .update();

    }
    /**
     * 根据部门ID查询部门信息（all）
     */
    @Override
    public List<Dept> getlistById(Integer deptId) {
        LambdaQueryWrapper<Dept> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Dept::getDeptId,deptId);
        return deptMapper.selectList(wrapper);
    }
    /**
     * 修改部门信息
     */
    @Override
    public void updateExcludeById(Dept dept) {
        lambdaUpdate()
                .eq(Dept::getDeptId,dept.getDeptId())
                .set(Dept::getDeptName,dept.getDeptName())
                .set(Dept::getParentId,dept.getParentId())
                .set(Dept::getOrderNum,dept.getOrderNum())
                .set(Dept::getLeader,dept.getLeader())
                .set(Dept::getPhone,dept.getPhone())
                .set(Dept::getEmail,dept.getEmail())
                .set(Dept::getStatus,dept.getStatus())
                .update();
    }
}
